subclasses <- c("Pvalb", "Sst", "Vip", "Lamp5", "Frem1", "Stac")

# pre-integration subclass comparison (DE genes)
for (pc in c(T, F)) {
  p <- PlotSubclassDEIntersection(subclass.markers[[1]], subclass.markers[[2]], 
                                  rownames(objs[[1]]), rownames(objs[[2]]),
                                  sample.names[[1]], sample.names[[2]],
                                  subclasses, 0.2, "E:/Transcriptomics_V1/Integration/Opossum_Mouse-P8/subclass_markers/", percentage = pc)
  print(p)
}
Warning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer range

# pre-integration type comparison (DE genes)
for (pc in c(T, F)) {
  for (sbcl in subclasses) {
    if (sbcl %in% names(type.markers[[1]]) & sbcl %in% names(type.markers[[2]])) {
      p <- PlotIdentDEIntersection(type.markers[[1]], type.markers[[2]],
                                   rownames(objs[[1]]), rownames(objs[[2]]),
                                   sample.names[[1]], sample.names[[2]],
                                   sbcl, sbcl, "type", "type", 0.2, percentage = pc)
      print(p)
    }
  }
}


sbcl_conf_plots <- PlotSubclassCrossConfusionMatrices(objs[[1]], objs[[2]], 
                                                      sample.names[[1]], sample.names[[2]], 
                                                      assay = "SCT",
                                                      subclasses, n_iters = 10, all.genes = FALSE, upsample = TRUE)
Warning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer range


print(sbcl_conf_plots[[1]])

print(sbcl_conf_plots[[2]])


subclass.labels <- c("Pvalb", "Sst", "Vip")
ident.labels <- c("type")

idnt_conf_plots <- PlotIdentCrossConfusionMatrices(objs[[1]], objs[[2]], 
                                                   sample.names[[1]], sample.names[[2]], 
                                                   assay = "SCT",
                                                   subclass.labels, ident.labels, n_iters = 10, 
                                                   ident.genes = TRUE, all.genes = FALSE, upsample = TRUE)
[1] "Using IntegrationFeatures from the Ident level..."
[1] "Using IntegrationFeatures from the Ident level..."
[1] "Using IntegrationFeatures from the Ident level..."


for (sbcl in subclass.labels) {
  for (id in ident.labels) {
    print(idnt_conf_plots[[sbcl]][[id]][["avg1"]])
    print(idnt_conf_plots[[sbcl]][[id]][["avg2"]])
  }
}


obj.integrated <- IntegrateObjects(objs[[1]], objs[[2]], resolutions = c(1, 2), nfeatures = 3000, subsample = TRUE)

PlotIntegration(obj.integrated, "species", c("integrated_snn_res.1", "integrated_snn_res.2"), subclasses)


objs.i <- SplitObject(obj.integrated, split.by = "species")

sbcl_conf_plots_i <- PlotSubclassCrossConfusionMatrices(objs.i[[1]], objs.i[[2]], 
                                                        sample.names[[1]], sample.names[[2]], 
                                                        assay = "integrated",
                                                        subclasses, n_iters = 10, all.genes = FALSE, upsample = TRUE)
Warning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer rangeWarning: NAs introduced by coercion to integer range


print(sbcl_conf_plots_i[[1]])

print(sbcl_conf_plots_i[[2]])


subclass.labels <- c("Pvalb", "Sst", "Vip")
ident.labels <- c("type")

idnt_conf_plots_i <- PlotIdentCrossConfusionMatrices(objs.i[[1]], objs.i[[2]], 
                                                     sample.names[[1]], sample.names[[2]], 
                                                     assay = "integrated",
                                                     subclass.labels, ident.labels, n_iters = 10, 
                                                     ident.genes = TRUE, all.genes = FALSE, upsample = TRUE)
[1] "Using IntegrationFeatures from the Ident level..."
Warning: Not all features provided are in this Assay object, removing the following feature(s): Ush1c, Cdh16, Aldh1a3, Exph5, Cldn11, Ndp, Grin2c, Azgp1, Plxnb3, Asb2, Dusp5, Dlk1, Vwa7, Commd1, Tnnt2, Zhx1, Tmem200c, Satl1, Rnasek, Rnase1, Ribc2, Cpz, Igfn1, 1810020O05Rik, Tmem42, Ebi3, Mael, Abcb6, Tmem182, Pudp, Cd4, Nr0b1, Ptgr1, Kdelr3, Uba52, Cnga3, Ghrh, Pbp2, Wnt9b, Tor4a, Hapln4, Cpt2, Bnc1, Chkb, Fermt1, Rnf139, Cel, Aspg, Ing4, Pdzd9, Ano7, Ikzf1, Hhip, Prnp, Nme3, Cyp27a1, Klk11, Cd5, Dscc1, Tcea3, Galnt2, Colq, Zc3h11a, Med20, Ppt2, Scn4b, Foxo4, Alox15, TinagWarning: Not all features provided are in this Assay object, removing the following feature(s): Ush1c, Cdh16, Aldh1a3, Exph5, Cldn11, Ndp, Grin2c, Azgp1, Plxnb3, Asb2, Dusp5, Dlk1, Vwa7, Commd1, Tnnt2, Zhx1, Tmem200c, Satl1, Rnasek, Rnase1, Ribc2, Cpz, Igfn1, 1810020O05Rik, Tmem42, Ebi3, Mael, Abcb6, Tmem182, Pudp, Cd4, Nr0b1, Ptgr1, Kdelr3, Uba52, Cnga3, Ghrh, Pbp2, Wnt9b, Tor4a, Hapln4, Cpt2, Bnc1, Chkb, Fermt1, Rnf139, Cel, Aspg, Ing4, Pdzd9, Ano7, Ikzf1, Hhip, Prnp, Nme3, Cyp27a1, Klk11, Cd5, Dscc1, Tcea3, Galnt2, Colq, Zc3h11a, Med20, Ppt2, Scn4b, Foxo4, Alox15, Tinag
[1] "Using IntegrationFeatures from the Ident level..."
[1] "Using IntegrationFeatures from the Ident level..."


for (sbcl in subclass.labels) {
  for (id in ident.labels) {
    print(idnt_conf_plots_i[[sbcl]][[id]][["avg1"]])
    print(idnt_conf_plots_i[[sbcl]][[id]][["avg2"]])
  }
}


objs.m <- MapObjects(objs.i[[1]], objs.i[[2]], c("subclass", "type"), assay = "integrated")

PlotMapping(objs.m, ident.order = subclasses)

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KFNldXJhdCkNCmxpYnJhcnkoU2V1cmF0RGlzaykNCmxpYnJhcnkocmV0aWN1bGF0ZSkNCmxpYnJhcnkoc2NydWJsZXRSKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShjbHVzdHJlZSkNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KHBseXIpDQpzb3VyY2UoIkM6L1J5YW4vR2l0SHViL3RyYWNodGVuYmVyZy1sYWIvdHJhbnNjcmlwdG9taWNzL3Rvb2xzL3NldXJhdF9mdW5jdGlvbnMuUiIpDQpzb3VyY2UoIkM6L1J5YW4vR2l0SHViL3RyYWNodGVuYmVyZy1sYWIvdHJhbnNjcmlwdG9taWNzL3Rvb2xzL3NldXJhdF9pbnRlZ3JhdGlvbl9mdW5jdGlvbnMuUiIpDQpzb3VyY2UoIkM6L1J5YW4vR2l0SHViL3RyYWNodGVuYmVyZy1sYWIvdHJhbnNjcmlwdG9taWNzL3hnYm9vc3QveGdib29zdF90cmFpbi5SIikNCnNvdXJjZSgiQzovUnlhbi9HaXRIdWIvdHJhY2h0ZW5iZXJnLWxhYi90cmFuc2NyaXB0b21pY3MveGdib29zdC9wbG90dGluZ0Z4bnMuUiIpDQoNCm9iai5vcG9zc3VtLmdhYmFlcmdpYyA8LSByZWFkUkRTKCJFOi9UcmFuc2NyaXB0b21pY3NfVjEvT3Bvc3N1bS9zZXVyYXQvb3Bvc3N1bV92MV9nYWJhZXJnaWNfcHJvY2Vzc2VkLnJkcyIpDQpvYmoub3Bvc3N1bS5nYWJhZXJnaWMkc3BlY2llcyA8LSAiT3Bvc3N1bSINCnN1YmNsYXNzLm1hcmtlcnMub3Bvc3N1bS5nYWJhZXJnaWMgPC0gcmVhZFJEUygiRTovVHJhbnNjcmlwdG9taWNzX1YxL09wb3NzdW0vc2V1cmF0L21hcmtlcl9nZW5lcy9tYXJrZXJkaWN0X3N1YmNsYXNzLnJkcyIpDQptYXJrZXJzLm9wb3NzdW0uZ2FiYWVyZ2ljIDwtIHJlYWRSRFMoIkU6L1RyYW5zY3JpcHRvbWljc19WMS9PcG9zc3VtL3NldXJhdC9tYXJrZXJfZ2VuZXMvbWFya2VyZGljdF90eXBlcy5yZHMiKQ0Kb2JqLm1vdXNlLmdhYmFlcmdpYy5QOCA8LSByZWFkUkRTKCJFOi9UcmFuc2NyaXB0b21pY3NfVjEvTW91c2Uvc2V1cmF0L21vdXNlX3YxX1A4X2dhYmFlcmdpY19wcm9jZXNzZWQucmRzIikNCm9iai5tb3VzZS5nYWJhZXJnaWMuUDgkc3BlY2llcyA8LSAiTW91c2UiDQpzdWJjbGFzcy5tYXJrZXJzLm1vdXNlLmdhYmFlcmdpYy5QOCA8LSByZWFkUkRTKCJFOi9UcmFuc2NyaXB0b21pY3NfVjEvTW91c2Uvc2V1cmF0L21hcmtlcl9nZW5lcy9QOC9tYXJrZXJkaWN0X3N1YmNsYXNzLnJkcyIpDQptYXJrZXJzLm1vdXNlLmdhYmFlcmdpYy5QOCA8LSByZWFkUkRTKCJFOi9UcmFuc2NyaXB0b21pY3NfVjEvTW91c2Uvc2V1cmF0L21hcmtlcl9nZW5lcy9QOC9tYXJrZXJkaWN0X3R5cGVzLnJkcyIpDQoNCm9ianMgPC0gbGlzdChvYmoub3Bvc3N1bS5nYWJhZXJnaWMsIG9iai5tb3VzZS5nYWJhZXJnaWMuUDgpDQpzdWJjbGFzcy5tYXJrZXJzIDwtIGxpc3Qoc3ViY2xhc3MubWFya2Vycy5vcG9zc3VtLmdhYmFlcmdpYywgc3ViY2xhc3MubWFya2Vycy5tb3VzZS5nYWJhZXJnaWMuUDgpDQp0eXBlLm1hcmtlcnMgPC0gbGlzdChtYXJrZXJzLm9wb3NzdW0uZ2FiYWVyZ2ljLCBtYXJrZXJzLm1vdXNlLmdhYmFlcmdpYy5QOCkNCnNhbXBsZS5uYW1lcyA8LSBsaXN0KCJPcG9zc3VtVjEiLCAiTW91c2VWMS1QOCIpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpzdWJjbGFzc2VzIDwtIGMoIlB2YWxiIiwgIlNzdCIsICJWaXAiLCAiTGFtcDUiLCAiRnJlbTEiLCAiU3RhYyIpDQoNCiMgcHJlLWludGVncmF0aW9uIHN1YmNsYXNzIGNvbXBhcmlzb24gKERFIGdlbmVzKQ0KZm9yIChwYyBpbiBjKFQsIEYpKSB7DQogIHAgPC0gUGxvdFN1YmNsYXNzREVJbnRlcnNlY3Rpb24oc3ViY2xhc3MubWFya2Vyc1tbMV1dLCBzdWJjbGFzcy5tYXJrZXJzW1syXV0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd25hbWVzKG9ianNbWzFdXSksIHJvd25hbWVzKG9ianNbWzJdXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLm5hbWVzW1sxXV0sIHNhbXBsZS5uYW1lc1tbMl1dLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNsYXNzZXMsIDAuMiwgIkU6L1RyYW5zY3JpcHRvbWljc19WMS9JbnRlZ3JhdGlvbi9PcG9zc3VtX01vdXNlLVA4L3N1YmNsYXNzX21hcmtlcnMvIiwgcGVyY2VudGFnZSA9IHBjKQ0KICBwcmludChwKQ0KfQ0KDQojIHByZS1pbnRlZ3JhdGlvbiB0eXBlIGNvbXBhcmlzb24gKERFIGdlbmVzKQ0KZm9yIChwYyBpbiBjKFQsIEYpKSB7DQogIGZvciAoc2JjbCBpbiBzdWJjbGFzc2VzKSB7DQogICAgaWYgKHNiY2wgJWluJSBuYW1lcyh0eXBlLm1hcmtlcnNbWzFdXSkgJiBzYmNsICVpbiUgbmFtZXModHlwZS5tYXJrZXJzW1syXV0pKSB7DQogICAgICBwIDwtIFBsb3RJZGVudERFSW50ZXJzZWN0aW9uKHR5cGUubWFya2Vyc1tbMV1dLCB0eXBlLm1hcmtlcnNbWzJdXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93bmFtZXMob2Jqc1tbMV1dKSwgcm93bmFtZXMob2Jqc1tbMl1dKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLm5hbWVzW1sxXV0sIHNhbXBsZS5uYW1lc1tbMl1dLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYmNsLCBzYmNsLCAidHlwZSIsICJ0eXBlIiwgMC4yLCBwZXJjZW50YWdlID0gcGMpDQogICAgICBwcmludChwKQ0KICAgIH0NCiAgfQ0KfQ0KDQpgYGANCg0KDQpgYGB7ciwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTZ9DQoNCnNiY2xfY29uZl9wbG90cyA8LSBQbG90U3ViY2xhc3NDcm9zc0NvbmZ1c2lvbk1hdHJpY2VzKG9ianNbWzFdXSwgb2Jqc1tbMl1dLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS5uYW1lc1tbMV1dLCBzYW1wbGUubmFtZXNbWzJdXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NheSA9ICJTQ1QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2xhc3Nlcywgbl9pdGVycyA9IDEwLCBhbGwuZ2VuZXMgPSBGQUxTRSwgdXBzYW1wbGUgPSBUUlVFKQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0KcHJpbnQoc2JjbF9jb25mX3Bsb3RzW1sxXV0pDQpwcmludChzYmNsX2NvbmZfcGxvdHNbWzJdXSkNCg0KYGBgDQoNCg0KYGBge3IsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD02fQ0KDQpzdWJjbGFzcy5sYWJlbHMgPC0gYygiUHZhbGIiLCAiU3N0IiwgIlZpcCIpDQppZGVudC5sYWJlbHMgPC0gYygidHlwZSIpDQoNCmlkbnRfY29uZl9wbG90cyA8LSBQbG90SWRlbnRDcm9zc0NvbmZ1c2lvbk1hdHJpY2VzKG9ianNbWzFdXSwgb2Jqc1tbMl1dLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS5uYW1lc1tbMV1dLCBzYW1wbGUubmFtZXNbWzJdXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NheSA9ICJTQ1QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2xhc3MubGFiZWxzLCBpZGVudC5sYWJlbHMsIG5faXRlcnMgPSAxMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC5nZW5lcyA9IFRSVUUsIGFsbC5nZW5lcyA9IEZBTFNFLCB1cHNhbXBsZSA9IFRSVUUpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpmb3IgKHNiY2wgaW4gc3ViY2xhc3MubGFiZWxzKSB7DQogIGZvciAoaWQgaW4gaWRlbnQubGFiZWxzKSB7DQogICAgcHJpbnQoaWRudF9jb25mX3Bsb3RzW1tzYmNsXV1bW2lkXV1bWyJhdmcxIl1dKQ0KICAgIHByaW50KGlkbnRfY29uZl9wbG90c1tbc2JjbF1dW1tpZF1dW1siYXZnMiJdXSkNCiAgfQ0KfQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0Kb2JqLmludGVncmF0ZWQgPC0gSW50ZWdyYXRlT2JqZWN0cyhvYmpzW1sxXV0sIG9ianNbWzJdXSwgcmVzb2x1dGlvbnMgPSBjKDEsIDIpLCBuZmVhdHVyZXMgPSAzMDAwLCBzdWJzYW1wbGUgPSBUUlVFKQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0KUGxvdEludGVncmF0aW9uKG9iai5pbnRlZ3JhdGVkLCAic3BlY2llcyIsIGMoImludGVncmF0ZWRfc25uX3Jlcy4xIiwgImludGVncmF0ZWRfc25uX3Jlcy4yIiksIHN1YmNsYXNzZXMpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpvYmpzLmkgPC0gU3BsaXRPYmplY3Qob2JqLmludGVncmF0ZWQsIHNwbGl0LmJ5ID0gInNwZWNpZXMiKQ0KDQpgYGANCg0KDQpgYGB7ciwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTZ9DQoNCnNiY2xfY29uZl9wbG90c19pIDwtIFBsb3RTdWJjbGFzc0Nyb3NzQ29uZnVzaW9uTWF0cmljZXMob2Jqcy5pW1sxXV0sIG9ianMuaVtbMl1dLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLm5hbWVzW1sxXV0sIHNhbXBsZS5uYW1lc1tbMl1dLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzYXkgPSAiaW50ZWdyYXRlZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNsYXNzZXMsIG5faXRlcnMgPSAxMCwgYWxsLmdlbmVzID0gRkFMU0UsIHVwc2FtcGxlID0gVFJVRSkNCg0KYGBgDQoNCg0KYGBge3J9DQoNCnByaW50KHNiY2xfY29uZl9wbG90c19pW1sxXV0pDQpwcmludChzYmNsX2NvbmZfcGxvdHNfaVtbMl1dKQ0KDQpgYGANCg0KDQpgYGB7ciwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTZ9DQoNCnN1YmNsYXNzLmxhYmVscyA8LSBjKCJQdmFsYiIsICJTc3QiLCAiVmlwIikNCmlkZW50LmxhYmVscyA8LSBjKCJ0eXBlIikNCg0KaWRudF9jb25mX3Bsb3RzX2kgPC0gUGxvdElkZW50Q3Jvc3NDb25mdXNpb25NYXRyaWNlcyhvYmpzLmlbWzFdXSwgb2Jqcy5pW1syXV0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUubmFtZXNbWzFdXSwgc2FtcGxlLm5hbWVzW1syXV0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NheSA9ICJpbnRlZ3JhdGVkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2xhc3MubGFiZWxzLCBpZGVudC5sYWJlbHMsIG5faXRlcnMgPSAxMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LmdlbmVzID0gVFJVRSwgYWxsLmdlbmVzID0gRkFMU0UsIHVwc2FtcGxlID0gVFJVRSkNCg0KYGBgDQoNCg0KYGBge3J9DQoNCmZvciAoc2JjbCBpbiBzdWJjbGFzcy5sYWJlbHMpIHsNCiAgZm9yIChpZCBpbiBpZGVudC5sYWJlbHMpIHsNCiAgICBwcmludChpZG50X2NvbmZfcGxvdHNfaVtbc2JjbF1dW1tpZF1dW1siYXZnMSJdXSkNCiAgICBwcmludChpZG50X2NvbmZfcGxvdHNfaVtbc2JjbF1dW1tpZF1dW1siYXZnMiJdXSkNCiAgfQ0KfQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0Kb2Jqcy5tIDwtIE1hcE9iamVjdHMob2Jqcy5pW1sxXV0sIG9ianMuaVtbMl1dLCBjKCJzdWJjbGFzcyIsICJ0eXBlIiksIGFzc2F5ID0gImludGVncmF0ZWQiKQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0KUGxvdE1hcHBpbmcob2Jqcy5tLCBpZGVudC5vcmRlciA9IHN1YmNsYXNzZXMpDQoNCmBgYA0KDQo=